import {onBlur} from "../display/focus.js"
import {on} from "../util/event.js"

// These must be handled carefully, because naively registering a
// handler for each editor will cause the editors to never be
// garbage collected.

function forEachCodeMirror(f) {
    if (!document.getElementsByClassName) return
    let byClass = document.getElementsByClassName("CodeMirror"), editors = []
    for (let i = 0; i < byClass.length; i++) {
        let cm = byClass[i].CodeMirror
        if (cm) editors.push(cm)
    }
    if (editors.length) editors[0].operation(() => {
        for (let i = 0; i < editors.length; i++) f(editors[i])
    })
}

let globalsRegistered = false

export function ensureGlobalHandlers() {
    if (globalsRegistered) return
    registerGlobalHandlers()
    globalsRegistered = true
}

function registerGlobalHandlers() {
    // When the window resizes, we need to refresh active editors.
    let resizeTimer
    on(window, "resize", () => {
        if (resizeTimer == null) resizeTimer = setTimeout(() => {
            resizeTimer = null
            forEachCodeMirror(onResize)
        }, 100)
    })
    // When the window loses focus, we want to show the editor as blurred
    on(window, "blur", () => forEachCodeMirror(onBlur))
}

// Called when the window resizes
function onResize(cm) {
    let d = cm.display
    // Might be a text scaling operation, clear size caches.
    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null
    d.scrollbarsClipped = false
    cm.setSize()
}
